
#define GET_BIT(x,n) ((x>>n)&1)
#define SET_BIT(x,n) x |=  (1<<n)
#define CLS_BIT(x,n) x &= ~(1<<n)

#define GPIO(g,p)         	  P##g^p
#define GPIO_SET(g,p)	  	  GPIO(g,p)=1
#define GPIO_CLS(g,p)	  	  GPIO(g,p)=0
#define GPIOS(g)         	  P##g
#define GPIOS_SET(g,v)   	  GPIOS(g) = v

#define GPIO_MODE_SET_IO(g,p) CLS_BIT(P##g##M1,p); CLS_BIT(P##g##M0,p)
#define GPIO_MODE_SET_PP(g,p) CLS_BIT(P##g##M1,p); SET_BIT(P##g##M0,p)
#define GPIO_MODE_SET_IN(g,p) SET_BIT(P##g##M1,p); CLS_BIT(P##g##M0,p)
#define GPIO_MODE_SET_OD(g,p) SET_BIT(P##g##M1,p); SET_BIT(P##g##M0,p)

#define GPIO_R_PU_SET(g,p)    SET_BIT(P##g##PU,p)
#define GPIO_R_PU_CLS(g,p)    CLS_BIT(P##g##PU,p)

#define GPIO_INT_ENABLE(g,p)   SET_BIT(P##g##INTE,p)
#define GPIO_INT_DISABLE(g,p)  CLS_BIT(P##g##INTE,p)
#define GPIO_INT_GET_FLAG(g,p) GET_BIT(P##g##INTF,p)
#define GPIO_INT_CLS_FLAG(g,p) CLS_BIT(P##g##INTF,p)

#define GPIO_INT_MODE_SET_EDGE_DOWN(g,p)  CLS_BIT(P##g##IM1,p); CLS_BIT(P##g##IM0,p)
#define GPIO_INT_MODE_SET_EDGE_UP(g,p)    CLS_BIT(P##g##IM1,p); SET_BIT(P##g##IM0,p)
#define GPIO_INT_MODE_SET_LOW(g,p)  	  SET_BIT(P##g##IM1,p); CLS_BIT(P##g##IM0,p)
#define GPIO_INT_MODE_SET_HIGH(g,p)    	  SET_BIT(P##g##IM1,p); SET_BIT(P##g##IM0,p)

#define GPIOS_INT_PRIORITY_LOWEST(g)  P##g##IPH=0; P##g##IPL=0
#define GPIOS_INT_PRIORITY_LOW(g)     P##g##IPH=0; P##g##IPL=1
#define GPIOS_INT_PRIORITY_HIGH(g)    P##g##IPH=1; P##g##IPL=0
#define GPIOS_INT_PRIORITY_HIGHEST(g) P##g##IPH=1; P##g##IPL=1